package bola8.entes;

import bola8.geometria.Geometria;
import bola8.geometria.Vector2D;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;

/**
 * Representa la colision entre dos entes
 * @author Jorge Berjano
 */
public class Colision implements Comparable {

    private double distancia;
    private Point2D puntoColision;

    private EnteMovil enteActivo;
    private Vector2D fuerzaEnteActivo;
    private Point2D posicionEnteActivo;

    private EnteMovil entePasivo;
    private Vector2D fuerzaEntePasivo;
    private Point2D posicionEntePasivo;

    public EnteMovil getEnteActivo() {
        return enteActivo;
    }

    public void setEnteActivo(EnteMovil enteActivo) {
        this.enteActivo = enteActivo;
    }

    public Vector2D getFuerzaEnteActivo() {
        return fuerzaEnteActivo;
    }

    public void setFuerzaEnteActivo(Vector2D fuerzaEnteActivo) {
        this.fuerzaEnteActivo = fuerzaEnteActivo;
    }

    public Point2D getPosicionEnteActivo() {
        return posicionEnteActivo;
    }

    public void setPosicionEnteActivo(Point2D posicionEnteActivo) {
        this.posicionEnteActivo = posicionEnteActivo;
    }

//    public Vector2D getFuerzaResultante() {
//        return fuerzaEnteActivo;
//    }
//
//    public void setFuerzaResultante(Vector2D fuerzaResultante) {
//        this.fuerzaEnteActivo = fuerzaResultante;
//    }

    public double getDistancia() {
        return distancia;
    }

    public void setDistancia(double distancia) {
        this.distancia = distancia;
    }

    public EnteMovil getEntePasivo() {
        return entePasivo;
    }

    public void setEntePasivo(EnteMovil entePasivo) {
        this.entePasivo = entePasivo;
    }

    public Vector2D getFuerzaEntePasivo() {
        return fuerzaEntePasivo;
    }

    public void setFuerzaEntePasivo(Vector2D fuerzaEntePasivo) {
        this.fuerzaEntePasivo = fuerzaEntePasivo;
    }

    public Point2D getPosicionEntePasivo() {
        return posicionEntePasivo;
    }

    public void setPosicionEntePasivo(Point2D posicionEntePasivo) {
        this.posicionEntePasivo = posicionEntePasivo;
    }

    public Point2D getPuntoColision() {
        return puntoColision;
    }

    public void setPuntoColision(Point2D puntoColision) {
        this.puntoColision = puntoColision;
    }

    public void ejecutar() {
        //System.out.println("colision de " + enteActivo + " contra " + entePasivo);
        enteActivo.getVelocidad().setModulo(0);
        enteActivo.aplicarFuerza(fuerzaEnteActivo);
        enteActivo.setPosicion(posicionEnteActivo);
        enteActivo.setProcesado(true);

        if (entePasivo != null && fuerzaEntePasivo != null && posicionEntePasivo != null) {
            entePasivo.aplicarFuerza(fuerzaEntePasivo);
            entePasivo.setPosicion(posicionEntePasivo);
        }
    }

    public int compareTo(Object o) {
        if (o instanceof Colision) {
            Colision otraColision = (Colision) o;
            if (Geometria.iguales(distancia, otraColision.distancia)) {
                return 0;
            } else if (distancia > otraColision.distancia) {
                return 1;
            } else {
                return -1;
            }
        }
        return 1;
    }

    public void pintar(Graphics2D graphics) {
//        graphics.setColor(Color.RED);
//
//        if (puntoColision != null) {
//            Point2D punto = puntoColision;
//            graphics.drawOval((int) punto.getX() - 1, (int) punto.getY() - 1, 2, 2);
//        }
//
//        if (fuerzaEnteActivo != null) {
//            Point2D p2 = fuerzaEnteActivo.trasladarPunto(posicionEnteActivo);
//            graphics.drawLine((int) posicionEnteActivo.getX(), (int) posicionEnteActivo.getY(), (int) p2.getX(), (int) p2.getY());
//        }
    }
}
